#ifndef EVENT_REPORT_PARAM_
#define EVENT_REPORT_PARAM_


/** video event param */
enum {
    RTCV_MAX_SVC_UP_STREAM_NUM = 5,
    RTCV_MAX_SVC_DOWN_STREAM_NUM = 25
};
struct RTSA_V_SEND_STATISTIC {
    uint32_t ssrc;
    uint32_t sendFrameRate;       // 帧率
    uint32_t intralFrameOriginBitrate; // 参考帧码率(APK原始流码率，I +大P) *1.05(加上RTP+UDP大
    uint32_t sendMediaBitrate;    // 原始流码率
    uint32_t sendNetworkBitrate;  // 网络码率（包括FEC,NACK等）
    uint32_t sendPacketDelayTime; // 打包时延（从上层调用到RTN发送的耗时，先加打印看看，是不是固定值）
    uint32_t sendPktRate;  // pkt速率(rtp个数/秒)
    uint32_t estSendBitrate;   // 预估带宽
    uint32_t sendEncodeType;   // H264/H265编码
    uint32_t sendRtt;
    uint32_t divideFrameDelay;  // 上行流入帧到拆包发出耗时（毫秒）
    
    uint64_t totalByte;      // 总发送字节数
    uint32_t totalPacketNum; // 总发包数
    uint32_t packetRate;     // 发包率
    uint32_t redRate;        // 冗余率
    uint32_t remoteJitter;   // 对端反馈的接收jitter
    uint32_t remoteLostRate; // 对端反馈的接收丢包率[0,100]

    uint32_t targetBitrate;        // 单流可用带宽（上层分配给每条流的带宽）
    uint32_t availableEncBitrate;  // 有效编码带宽
    uint32_t inputFrameCnt;        // 上行累计编码输入帧数量
    uint32_t sendFrameCnt;         // 上行实际发送帧数量
    uint32_t sendBaseFrameCnt;     // 上行基础帧个数
    uint32_t sendMidLayerFrameCnt; // 上行发送中间层帧个数
    uint32_t sendOutLayerFrameCnt; // 上行发送最外层帧个数

    uint32_t dataCacheBytes;          // 当前流控缓存字节数
    uint64_t pacingSendMaxDelay;      // 流控发送单帧的最大时延，秒级统计
    uint64_t pacingSendAveDelay;      // 流控发送单帧的平均时延，秒级统计
    uint32_t recvKeyRequestCnt;       // 收到I帧请求总数量(端侧有用，SFU侧当前I帧请求RTCP包自己管理)
    uint32_t recvNackRequestCnt;      // 收到nack帧请求总数量
    uint32_t nackResponsePktCnt;      // nack响应的包数量
    uint32_t nackNotRspForNotFindCnt; // nack未找到数据包不响应的包数量
    uint32_t outputFrameCnt;
};

struct RTSA_V_RECV_STATISTIC {
    uint32_t ssrc;
    uint32_t isRtcp;
    uint32_t recvFrameRate;       // 帧率
    uint32_t recvMediaBitrate;    // 原始流码率
    uint32_t recvNetworkBitrate;  // 网络码率（包括FEC,NACK等）
    uint32_t recvPacketDelayTime; // 打包时延（从上层调用到RTN发送的耗时，先加打印看看，是不是固定值）
    uint32_t recvPktRate;  // pkt速率(rtp个数/秒)
    uint32_t recvLossRate; // 丢包率 百分比格式化为255 （基于RTP的seqnum）
    uint32_t estRecvBitRate;   // 预估带宽
    uint32_t recvRtt;      // 发送端到SFU的环路时延
    uint32_t recvDropDeltaFrameNum; // sfu丢弃的小P帧数量
    uint32_t intralFrameOriginBitrate;     // sfu转发的I帧+大P帧速率
    uint32_t totalFrozenTime; // 远端用户在加入频道后发生视频卡顿的累计时长（毫秒）
    uint32_t endToEndTimeDelay; // 端到端的网络时延
    uint32_t buildFrameDelay;   // 下行流收包到组帧上报耗时（毫秒）
    
    uint64_t totalByte;      // 总接收字节数
    uint32_t totalPacketNum; // 总接收包数
    uint32_t jitter;         // 抖动值

    // 添加信息
    uint32_t lostPktCnt;            // 累计丢包数
    uint32_t redRate;               // 冗余率，秒级统计 冗余包数/总包数
    uint32_t recoverRate;           // 恢复率，秒级统计，恢复的包数/总包数
    uint32_t notRecvPktCnt;         // 累计收包间隔超200ms次数
    uint64_t notRecvPktTotalTime;   // 累计收包间隔超200ms时长
    uint32_t nackRequestCnt;        // 累计nack请求数量
    uint32_t sendKeyRequestCnt;     // I帧请求数量
    uint32_t JbJitter;              // JB评估抖动值(包抖动和帧抖动两方面影响) 端侧有用
    uint32_t JbDepth;               // JB缓存深度（ok数量），端侧有用
    uint32_t recvTotalFrameCnt;     // 下行接收总帧数
    uint32_t recvBaseLayerFrameCnt; // 下行接收基础层总帧数
    uint32_t recvMidLayerFrameCnt;  // 下行接收中间层总帧数
    uint32_t recvOutLayerFrameCnt;  // 下行接收最外层总帧数
    uint32_t JbTotalFrameCnt;       // JB输出总帧数
    uint32_t JbBaseLayerFrameCnt;   // JB输出基础层总帧数
    uint32_t JbMidLayerFrameCnt;    // JB输出中间层总帧数
    uint32_t JbOutLayerFrameCnt;    // JB输出最外层总帧数
    uint32_t JbListframeNum;        // 帧列表帧数量
    uint32_t frameBuildFailCnt;     // 组帧失败的次数
    uint32_t forceOut4KeyCnt;       // I帧强制出帧的次数
    uint32_t forceOut4StructCnt;    // 大小P强制出帧的次数
    uint64_t currentOutputDiftime;  // 当前与上一次帧输出间隔时间
    uint64_t aveJbDelayAfterBuild;  // 完整帧在Jb内部时延
    
    uint32_t shortFreezeCnt;        // 累计jitter buffer出帧间隔超过200ms的次数
    uint32_t middleFreezeCnt;       // 累计内jitter buffer出帧间隔超过600ms的次数
    uint32_t longFreezeCnt;         // 累计内jitter buffer出帧间隔超过1000ms的次数
    uint32_t shortFreezeTime;       // 累计内jitter buffer出帧间隔超过200ms的总时长
    uint32_t middleFreezeTime;      // 累计内jitter buffer出帧间隔超过600ms的总时长
    uint32_t longFreezeTime;        // 累计内jitter buffer出帧间隔超过1000ms的总时长
};

struct RTSA_V_SEND_CONNECTION_STATISTIC {
    int32_t  avgdelay = 0;            /* RTT时延 */
    uint64_t totalByte = 0;          // 总发送字节数
    uint32_t totalPacketNum = 0;     // 总发包数
    uint32_t curSendBitRate = 0;     // 发送码率,包括FEC,NACK
    uint32_t estimateBitRate = 0;    // 上行总预估带宽
    uint32_t streamNum = 0;          // 当前通道stream数量
};

struct RTSA_V_RECV_CONNECTION_STATISTIC {
    uint32_t netState = 0;           /* 接收网络状态 */
    uint32_t lostRate = 0;           /* 瞬时丢包率 */
    uint32_t longTermLossRate = 0;   /* 长期丢包率 */
    int32_t  avgdelay = 0;            /* RTT时延 */
    uint32_t curRecvBitRate = 0;      /* 码率 */
    uint64_t totalByte = 0;          // 总发送字节数
    uint32_t totalPacketNum = 0;     // 总发包数
    uint32_t estimateBitRate = 0;    // 下行总预估带宽
    uint32_t streamNum = 0;          // 当前通道stream数量
};

struct RTSA_V_EVENT {
    // send net statistics
    uint32_t sendStatisticSize;
    RTSA_V_SEND_CONNECTION_STATISTIC sendConnStatistic;
    RTSA_V_SEND_STATISTIC sendStatistic[RTCV_MAX_SVC_UP_STREAM_NUM];

    // recv net statistics
    uint32_t recvStatisticSize;
    RTSA_V_RECV_CONNECTION_STATISTIC recvConnStatistic;
    RTSA_V_RECV_STATISTIC recvStatistic[RTCV_MAX_SVC_DOWN_STREAM_NUM];
};


/** audio event param */
struct RTSA_A_EVENT {
    // heartbeat
    int heartBeatReason;
    bool isRtcp;
    long long timestamp;

    // both send and recv
    long ssrc;
    int rtt;

    // send
    int pktSent;
    int pktLoss;

    // recv
    int jitter;
    int pktReceived;
    int pktLostCnt;

    // end to end
    int endToEndTimeDelay;
    unsigned int e2eDelay; 
    int sendBitRate;
    int recvBitRate;
};


#endif